{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from mpl_toolkits import mplot3d\n",
    "import matplotlib.pyplot as plt\n",
    "from cross_policy_evaluate import load_model, get_structure"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "dataset_env_names = [\"particle-medium-v0\", \"particle-medium-replay-v0\", \"particle-random-v0\"]\n",
    "axis_step_num = 301\n",
    "x = np.linspace(-150, 150, axis_step_num)\n",
    "y = np.linspace(-150, 150, axis_step_num)\n",
    "x, y = np.meshgrid(x, y)\n",
    "inputs = np.zeros([axis_step_num ** 2, 7])\n",
    "inputs[:, -3] = x.reshape(axis_step_num ** 2)\n",
    "inputs[:, -2] = y.reshape(axis_step_num ** 2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ BNN ] Name BNN_0 | Observation dim 6 | Action dim: 1 | Hidden dim: 100\n",
      "Specified load dir /home/frank/Documents/project/offline_rl/causal_mopo/experiments/particle/particle-medium-v0/oracle-100\n",
      "[ BNN ] Initializing model: BNN_0 | 7 networks | 5 elites\n",
      "Created an ensemble of 7 neural networks with variance predictions | Elites: 5\n",
      "Added layer with input dim 7 , output dim 100\n",
      "Added layer with input dim 100 , output dim 100\n",
      "Added layer with input dim 100 , output dim 100\n",
      "Added layer with input dim 100 , output dim 1\n",
      "Added layer with input dim 100 , output dim 1\n",
      "[ BNN ] Model: <mopo.models.causal_bnn.CausalBNN object at 0x7f32180c5438>\n"
     ]
    },
    {
     "ename": "ResourceExhaustedError",
     "evalue": "2 root error(s) found.\n  (0) Resource exhausted: OOM when allocating tensor with shape[7,7,90601,100] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc\n\t [[node BNN_0_2/Sigmoid (defined at /home/frank/Documents/project/offline_rl/causal_mopo/mopo/models/sparse_fc.py:20) ]]\nHint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.\n\n  (1) Resource exhausted: OOM when allocating tensor with shape[7,7,90601,100] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc\n\t [[node BNN_0_2/Sigmoid (defined at /home/frank/Documents/project/offline_rl/causal_mopo/mopo/models/sparse_fc.py:20) ]]\nHint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.\n\n\t [[BNN_0_2/Identity/_35]]\nHint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.\n\n0 successful operations.\n0 derived errors ignored.\n\nErrors may have originated from an input operation.\nInput Source operations connected to node BNN_0_2/Sigmoid:\n BNN_0_2/add (defined at /home/frank/Documents/project/offline_rl/causal_mopo/mopo/models/sparse_fc.py:98)\n\nInput Source operations connected to node BNN_0_2/Sigmoid:\n BNN_0_2/add (defined at /home/frank/Documents/project/offline_rl/causal_mopo/mopo/models/sparse_fc.py:98)\n\nOriginal stack trace for 'BNN_0_2/Sigmoid':\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/runpy.py\", line 193, in _run_module_as_main\n    \"__main__\", mod_spec)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/runpy.py\", line 85, in _run_code\n    exec(code, run_globals)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/ipykernel_launcher.py\", line 16, in <module>\n    app.launch_new_instance()\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/traitlets/config/application.py\", line 664, in launch_instance\n    app.start()\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/ipykernel/kernelapp.py\", line 612, in start\n    self.io_loop.start()\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tornado/platform/asyncio.py\", line 199, in start\n    self.asyncio_loop.run_forever()\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/asyncio/base_events.py\", line 422, in run_forever\n    self._run_once()\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/asyncio/base_events.py\", line 1432, in _run_once\n    handle._run()\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/asyncio/events.py\", line 145, in _run\n    self._callback(*self._args)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tornado/ioloop.py\", line 688, in <lambda>\n    lambda f: self._run_callback(functools.partial(callback, future))\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tornado/ioloop.py\", line 741, in _run_callback\n    ret = callback()\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tornado/gen.py\", line 814, in inner\n    self.ctx_run(self.run)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tornado/gen.py\", line 162, in _fake_ctx_run\n    return f(*args, **kw)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tornado/gen.py\", line 775, in run\n    yielded = self.gen.send(value)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/ipykernel/kernelbase.py\", line 365, in process_one\n    yield gen.maybe_future(dispatch(*args))\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tornado/gen.py\", line 234, in wrapper\n    yielded = ctx_run(next, result)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tornado/gen.py\", line 162, in _fake_ctx_run\n    return f(*args, **kw)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/ipykernel/kernelbase.py\", line 268, in dispatch_shell\n    yield gen.maybe_future(handler(stream, idents, msg))\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tornado/gen.py\", line 234, in wrapper\n    yielded = ctx_run(next, result)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tornado/gen.py\", line 162, in _fake_ctx_run\n    return f(*args, **kw)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/ipykernel/kernelbase.py\", line 545, in execute_request\n    user_expressions, allow_stdin,\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tornado/gen.py\", line 234, in wrapper\n    yielded = ctx_run(next, result)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tornado/gen.py\", line 162, in _fake_ctx_run\n    return f(*args, **kw)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/ipykernel/ipkernel.py\", line 306, in do_execute\n    res = shell.run_cell(code, store_history=store_history, silent=silent)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/ipykernel/zmqshell.py\", line 536, in run_cell\n    return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/IPython/core/interactiveshell.py\", line 2867, in run_cell\n    raw_cell, store_history, silent, shell_futures)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/IPython/core/interactiveshell.py\", line 2895, in _run_cell\n    return runner(coro)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/IPython/core/async_helpers.py\", line 68, in _pseudo_sync_runner\n    coro.send(None)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/IPython/core/interactiveshell.py\", line 3072, in run_cell_async\n    interactivity=interactivity, compiler=compiler, result=result)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/IPython/core/interactiveshell.py\", line 3263, in run_ast_nodes\n    if (await self.run_code(code, result,  async_=asy)):\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/IPython/core/interactiveshell.py\", line 3343, in run_code\n    exec(code_obj, self.user_global_ns, self.user_ns)\n  File \"<ipython-input-10-571a380bbbfe>\", line 3, in <module>\n    model = load_model(env_name, \"oracle-100\", get_structure(\"oracle\", \"particle\"))\n  File \"/home/frank/Documents/project/offline_rl/causal_mopo/mopo/models/cross_policy_evaluate.py\", line 33, in load_model\n    name=\"BNN_0\", load_dir=model_save_dir, hidden_dim=hidden_dim)\n  File \"/home/frank/Documents/project/offline_rl/causal_mopo/mopo/models/constructor.py\", line 89, in construct_casual_model\n    casual_model.finalize(tf.train.AdamOptimizer, {\"learning_rate\": 0.001})\n  File \"/home/frank/Documents/project/offline_rl/causal_mopo/mopo/models/causal_bnn.py\", line 307, in finalize\n    self.create_prediction_tensors(self.sy_pred_in4d, factored=True)\n  File \"/home/frank/Documents/project/offline_rl/causal_mopo/mopo/models/causal_bnn.py\", line 756, in create_prediction_tensors\n    factored_mean, factored_variance = self._compile_outputs(inputs)\n  File \"/home/frank/Documents/project/offline_rl/causal_mopo/mopo/models/causal_bnn.py\", line 899, in _compile_outputs\n    mean = layer.compute_output_tensor(mean)\n  File \"/home/frank/Documents/project/offline_rl/causal_mopo/mopo/models/sparse_fc.py\", line 103, in compute_output_tensor\n    return SparseFC._activations[self.activation](raw_output)\n  File \"/home/frank/Documents/project/offline_rl/causal_mopo/mopo/models/sparse_fc.py\", line 20, in <lambda>\n    \"swish\": lambda x: x * tf.sigmoid(x)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tensorflow/python/ops/math_ops.py\", line 2998, in sigmoid\n    return gen_math_ops.sigmoid(x, name=name)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tensorflow/python/ops/gen_math_ops.py\", line 9360, in sigmoid\n    \"Sigmoid\", x=x, name=name)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py\", line 788, in _apply_op_helper\n    op_def=op_def)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tensorflow/python/util/deprecation.py\", line 507, in new_func\n    return func(*args, **kwargs)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tensorflow/python/framework/ops.py\", line 3616, in create_op\n    op_def=op_def)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tensorflow/python/framework/ops.py\", line 2005, in __init__\n    self._traceback = tf_stack.extract_stack()\n",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mResourceExhaustedError\u001b[0m                    Traceback (most recent call last)",
      "\u001b[0;32m~/anaconda3/envs/mopo/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_do_call\u001b[0;34m(self, fn, *args)\u001b[0m\n\u001b[1;32m   1355\u001b[0m     \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1356\u001b[0;31m       \u001b[0;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1357\u001b[0m     \u001b[0;32mexcept\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mOpError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/mopo/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_run_fn\u001b[0;34m(feed_dict, fetch_list, target_list, options, run_metadata)\u001b[0m\n\u001b[1;32m   1340\u001b[0m       return self._call_tf_sessionrun(\n\u001b[0;32m-> 1341\u001b[0;31m           options, feed_dict, fetch_list, target_list, run_metadata)\n\u001b[0m\u001b[1;32m   1342\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/mopo/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_call_tf_sessionrun\u001b[0;34m(self, options, feed_dict, fetch_list, target_list, run_metadata)\u001b[0m\n\u001b[1;32m   1428\u001b[0m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_session\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moptions\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeed_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfetch_list\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtarget_list\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1429\u001b[0;31m         run_metadata)\n\u001b[0m\u001b[1;32m   1430\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mResourceExhaustedError\u001b[0m: 2 root error(s) found.\n  (0) Resource exhausted: OOM when allocating tensor with shape[7,7,90601,100] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc\n\t [[{{node BNN_0_2/Sigmoid}}]]\nHint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.\n\n  (1) Resource exhausted: OOM when allocating tensor with shape[7,7,90601,100] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc\n\t [[{{node BNN_0_2/Sigmoid}}]]\nHint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.\n\n\t [[BNN_0_2/Identity/_35]]\nHint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.\n\n0 successful operations.\n0 derived errors ignored.",
      "\nDuring handling of the above exception, another exception occurred:\n",
      "\u001b[0;31mResourceExhaustedError\u001b[0m                    Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-10-571a380bbbfe>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mload_model\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0menv_name\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"oracle-100\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mget_structure\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"oracle\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"particle\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mpredict_output\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      5\u001b[0m \u001b[0mvs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpredict_output\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/Documents/project/offline_rl/causal_mopo/mopo/models/causal_bnn.py\u001b[0m in \u001b[0;36mpredict\u001b[0;34m(self, inputs, factored, *args, **kwargs)\u001b[0m\n\u001b[1;32m    737\u001b[0m             \u001b[0minputs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_4d_inputs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    738\u001b[0m             outputs = self.sess.run([self.sy_pred_mean4d_fac, self.sy_pred_var4d_fac],\n\u001b[0;32m--> 739\u001b[0;31m                                     feed_dict={self.sy_pred_in4d: inputs})\n\u001b[0m\u001b[1;32m    740\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    741\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mfactored\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/mopo/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36mrun\u001b[0;34m(self, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m    948\u001b[0m     \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    949\u001b[0m       result = self._run(None, fetches, feed_dict, options_ptr,\n\u001b[0;32m--> 950\u001b[0;31m                          run_metadata_ptr)\n\u001b[0m\u001b[1;32m    951\u001b[0m       \u001b[0;32mif\u001b[0m \u001b[0mrun_metadata\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    952\u001b[0m         \u001b[0mproto_data\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtf_session\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTF_GetBuffer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrun_metadata_ptr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/mopo/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_run\u001b[0;34m(self, handle, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m   1171\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mfinal_fetches\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mfinal_targets\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mhandle\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mfeed_dict_tensor\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1172\u001b[0m       results = self._do_run(handle, final_targets, final_fetches,\n\u001b[0;32m-> 1173\u001b[0;31m                              feed_dict_tensor, options, run_metadata)\n\u001b[0m\u001b[1;32m   1174\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1175\u001b[0m       \u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/mopo/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_do_run\u001b[0;34m(self, handle, target_list, fetch_list, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m   1348\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mhandle\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1349\u001b[0m       return self._do_call(_run_fn, feeds, fetches, targets, options,\n\u001b[0;32m-> 1350\u001b[0;31m                            run_metadata)\n\u001b[0m\u001b[1;32m   1351\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1352\u001b[0m       \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_do_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_prun_fn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhandle\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeeds\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfetches\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/mopo/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_do_call\u001b[0;34m(self, fn, *args)\u001b[0m\n\u001b[1;32m   1368\u001b[0m           \u001b[0;32mpass\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1369\u001b[0m       \u001b[0mmessage\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0merror_interpolation\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minterpolate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmessage\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_graph\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1370\u001b[0;31m       \u001b[0;32mraise\u001b[0m \u001b[0mtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnode_def\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mop\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmessage\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1371\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1372\u001b[0m   \u001b[0;32mdef\u001b[0m \u001b[0m_extend_graph\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mResourceExhaustedError\u001b[0m: 2 root error(s) found.\n  (0) Resource exhausted: OOM when allocating tensor with shape[7,7,90601,100] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc\n\t [[node BNN_0_2/Sigmoid (defined at /home/frank/Documents/project/offline_rl/causal_mopo/mopo/models/sparse_fc.py:20) ]]\nHint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.\n\n  (1) Resource exhausted: OOM when allocating tensor with shape[7,7,90601,100] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc\n\t [[node BNN_0_2/Sigmoid (defined at /home/frank/Documents/project/offline_rl/causal_mopo/mopo/models/sparse_fc.py:20) ]]\nHint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.\n\n\t [[BNN_0_2/Identity/_35]]\nHint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.\n\n0 successful operations.\n0 derived errors ignored.\n\nErrors may have originated from an input operation.\nInput Source operations connected to node BNN_0_2/Sigmoid:\n BNN_0_2/add (defined at /home/frank/Documents/project/offline_rl/causal_mopo/mopo/models/sparse_fc.py:98)\n\nInput Source operations connected to node BNN_0_2/Sigmoid:\n BNN_0_2/add (defined at /home/frank/Documents/project/offline_rl/causal_mopo/mopo/models/sparse_fc.py:98)\n\nOriginal stack trace for 'BNN_0_2/Sigmoid':\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/runpy.py\", line 193, in _run_module_as_main\n    \"__main__\", mod_spec)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/runpy.py\", line 85, in _run_code\n    exec(code, run_globals)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/ipykernel_launcher.py\", line 16, in <module>\n    app.launch_new_instance()\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/traitlets/config/application.py\", line 664, in launch_instance\n    app.start()\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/ipykernel/kernelapp.py\", line 612, in start\n    self.io_loop.start()\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tornado/platform/asyncio.py\", line 199, in start\n    self.asyncio_loop.run_forever()\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/asyncio/base_events.py\", line 422, in run_forever\n    self._run_once()\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/asyncio/base_events.py\", line 1432, in _run_once\n    handle._run()\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/asyncio/events.py\", line 145, in _run\n    self._callback(*self._args)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tornado/ioloop.py\", line 688, in <lambda>\n    lambda f: self._run_callback(functools.partial(callback, future))\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tornado/ioloop.py\", line 741, in _run_callback\n    ret = callback()\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tornado/gen.py\", line 814, in inner\n    self.ctx_run(self.run)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tornado/gen.py\", line 162, in _fake_ctx_run\n    return f(*args, **kw)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tornado/gen.py\", line 775, in run\n    yielded = self.gen.send(value)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/ipykernel/kernelbase.py\", line 365, in process_one\n    yield gen.maybe_future(dispatch(*args))\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tornado/gen.py\", line 234, in wrapper\n    yielded = ctx_run(next, result)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tornado/gen.py\", line 162, in _fake_ctx_run\n    return f(*args, **kw)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/ipykernel/kernelbase.py\", line 268, in dispatch_shell\n    yield gen.maybe_future(handler(stream, idents, msg))\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tornado/gen.py\", line 234, in wrapper\n    yielded = ctx_run(next, result)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tornado/gen.py\", line 162, in _fake_ctx_run\n    return f(*args, **kw)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/ipykernel/kernelbase.py\", line 545, in execute_request\n    user_expressions, allow_stdin,\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tornado/gen.py\", line 234, in wrapper\n    yielded = ctx_run(next, result)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tornado/gen.py\", line 162, in _fake_ctx_run\n    return f(*args, **kw)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/ipykernel/ipkernel.py\", line 306, in do_execute\n    res = shell.run_cell(code, store_history=store_history, silent=silent)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/ipykernel/zmqshell.py\", line 536, in run_cell\n    return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/IPython/core/interactiveshell.py\", line 2867, in run_cell\n    raw_cell, store_history, silent, shell_futures)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/IPython/core/interactiveshell.py\", line 2895, in _run_cell\n    return runner(coro)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/IPython/core/async_helpers.py\", line 68, in _pseudo_sync_runner\n    coro.send(None)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/IPython/core/interactiveshell.py\", line 3072, in run_cell_async\n    interactivity=interactivity, compiler=compiler, result=result)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/IPython/core/interactiveshell.py\", line 3263, in run_ast_nodes\n    if (await self.run_code(code, result,  async_=asy)):\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/IPython/core/interactiveshell.py\", line 3343, in run_code\n    exec(code_obj, self.user_global_ns, self.user_ns)\n  File \"<ipython-input-10-571a380bbbfe>\", line 3, in <module>\n    model = load_model(env_name, \"oracle-100\", get_structure(\"oracle\", \"particle\"))\n  File \"/home/frank/Documents/project/offline_rl/causal_mopo/mopo/models/cross_policy_evaluate.py\", line 33, in load_model\n    name=\"BNN_0\", load_dir=model_save_dir, hidden_dim=hidden_dim)\n  File \"/home/frank/Documents/project/offline_rl/causal_mopo/mopo/models/constructor.py\", line 89, in construct_casual_model\n    casual_model.finalize(tf.train.AdamOptimizer, {\"learning_rate\": 0.001})\n  File \"/home/frank/Documents/project/offline_rl/causal_mopo/mopo/models/causal_bnn.py\", line 307, in finalize\n    self.create_prediction_tensors(self.sy_pred_in4d, factored=True)\n  File \"/home/frank/Documents/project/offline_rl/causal_mopo/mopo/models/causal_bnn.py\", line 756, in create_prediction_tensors\n    factored_mean, factored_variance = self._compile_outputs(inputs)\n  File \"/home/frank/Documents/project/offline_rl/causal_mopo/mopo/models/causal_bnn.py\", line 899, in _compile_outputs\n    mean = layer.compute_output_tensor(mean)\n  File \"/home/frank/Documents/project/offline_rl/causal_mopo/mopo/models/sparse_fc.py\", line 103, in compute_output_tensor\n    return SparseFC._activations[self.activation](raw_output)\n  File \"/home/frank/Documents/project/offline_rl/causal_mopo/mopo/models/sparse_fc.py\", line 20, in <lambda>\n    \"swish\": lambda x: x * tf.sigmoid(x)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tensorflow/python/ops/math_ops.py\", line 2998, in sigmoid\n    return gen_math_ops.sigmoid(x, name=name)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tensorflow/python/ops/gen_math_ops.py\", line 9360, in sigmoid\n    \"Sigmoid\", x=x, name=name)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py\", line 788, in _apply_op_helper\n    op_def=op_def)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tensorflow/python/util/deprecation.py\", line 507, in new_func\n    return func(*args, **kwargs)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tensorflow/python/framework/ops.py\", line 3616, in create_op\n    op_def=op_def)\n  File \"/home/frank/anaconda3/envs/mopo/lib/python3.6/site-packages/tensorflow/python/framework/ops.py\", line 2005, in __init__\n    self._traceback = tf_stack.extract_stack()\n"
     ]
    }
   ],
   "source": [
    "env_name = \"particle-medium-v0\"\n",
    "\n",
    "model = load_model(env_name, \"oracle-100\", get_structure(\"oracle\", \"particle\"))\n",
    "predict_output = model.predict(inputs)[0]\n",
    "vs = predict_output[:, 2]\n",
    "\n",
    "fig = plt.figure()\n",
    "ax = plt.axes(projection='3d')\n",
    "ax.contour3D(x, y, vs.reshape(axis_step_num, axis_step_num), cmap='binary')\n",
    "ax.set_xlabel('x')\n",
    "ax.set_ylabel('y')\n",
    "ax.set_zlabel('z')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ BNN ] Name BNN_0 | Observation dim 6 | Action dim: 1 | Hidden dim: 100\n",
      "Specified load dir /home/frank/Documents/project/offline_rl/causal_mopo/experiments/particle/particle-medium-replay-v0/oracle-100\n",
      "[ BNN ] Initializing model: BNN_0 | 7 networks | 5 elites\n",
      "Created an ensemble of 7 neural networks with variance predictions | Elites: 5\n",
      "Added layer with input dim 7 , output dim 100\n",
      "Added layer with input dim 100 , output dim 100\n",
      "Added layer with input dim 100 , output dim 100\n",
      "Added layer with input dim 100 , output dim 1\n",
      "Added layer with input dim 100 , output dim 1\n",
      "[ BNN ] Model: <mopo.models.causal_bnn.CausalBNN object at 0x7f3218791e48>\n"
     ]
    },
    {
     "data": {
      "image/png": "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CjQ2NkIsFkMul7spIsdCd3e3T0HBbDbjjjvuwM0334y77757Ss/fj7nD3EntZgl/+tOfUFBQgHvuuYe69HojrxBS1ZcdDzzwANavXw+GYSCXy/HAAw/g6NGj1E7/Zz/7GYqLi/Hkk0+itrYWE2SEAEYCTnh4OLKysrB8+XLExcVBrVajpKQElZWVY+o3yI6OicoHq9WKPXv24LrrrsP9998/L4hXU8UvfvELvPDCC/T7xx57DL///e+v3AHNEuZ9KTEeqWr58uWIiIgAwzD4+c9/jr6+Prz22mt46KGHsHz5cnz9618HANx777249tprcdNNN8314V8RaDQafPDBB3j33XfR0dFBPSUm68XAsix0Oh31fAwICIBcLkdERAQUCgUGBgZQWFg4blZhs9nwjW98A6tWrcIjjzzypQ4KwMgodteuXbh8+TKcTifS09NRUlIyXafqefeizPtSwldS1Te/+U1cf/31APzkFYlEgj179mDPnj3UU+L5559HY2Mj9ZRYtGjRhEGCYRiEhIQgJCQEaWlp1Bj2woULsNvtSE1NhcPhGDMw2O123HfffViyZMlXIigAI1uppFIpysrKMDAwgAULFsypff1c4UtdSvT19dH/v/fee9T4dfv27di7dy8sFgva2trQ1NSEpUuXXqnDvKIQi8W49dZbsW/fPnz++edYtWoV/vrXv2LlypX48Y9/jHPnzvks8w4ODkZgYCACAwOxaNEiOBwOlJeX49KlS+jq6oLFYqG3dTgc+Pa3v42cnBz89Kc/nZWg8PjjjyM2NhZFRUUoKirCoUOH6O/GkvrPBO677z784x//wN///vevbBN13pcS4+HOO+9EeXk5GIZBUlIS/vrXvyI6OhrA2KQqP0ZgNpvxySefYP/+/bh8+TJWrlyJnTt3YuXKlWPKvPv6+tDb24uioiK3LMHVWl+tVuPcuXPo6upCYmIifvOb38xapnClplJWqxX5+fmw2Wxoamqaifudd6nUlzow+DEzsFqtOHbsGN555x18/vnnWLZsGXbs2IE1a9ZQT4n+/n50d3dPaDmvUCjwve99D1VVVYiKisJ99903a1fVsQLDU089BQD46U9/CgDYsmULHn/88RmdSj3wwAOQSCQzZfAy7wLDl7qUmEt8ld1+BAIBtm7dipdffhnl5eW44447cOjQIaxevRoPPPAAfvnLX+KZ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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "env_name = \"particle-medium-replay-v0\"\n",
    "\n",
    "model = load_model(env_name, \"oracle-100\", get_structure(\"oracle\", \"particle\"))\n",
    "predict_output = model.predict(inputs)[0]\n",
    "vs = predict_output[:, 2]\n",
    "\n",
    "fig = plt.figure()\n",
    "ax = plt.axes(projection='3d')\n",
    "ax.contour3D(x, y, vs.reshape(axis_step_num, axis_step_num), 50, cmap='binary')\n",
    "ax.set_xlabel('x')\n",
    "ax.set_ylabel('y')\n",
    "ax.set_zlabel('z')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "env_name = \"particle-random-v0\"\n",
    "\n",
    "model = load_model(env_name, \"oracle-100\", get_structure(\"oracle\", \"particle\"))\n",
    "predict_output = model.predict(inputs)[0]\n",
    "vs = predict_output[:, 2]\n",
    "\n",
    "fig = plt.figure()\n",
    "ax = plt.axes(projection='3d')\n",
    "ax.contour3D(x, y, vs.reshape(axis_step_num, axis_step_num), 50, cmap='binary')\n",
    "ax.set_xlabel('x')\n",
    "ax.set_ylabel('y')\n",
    "ax.set_zlabel('z')\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
